from django.conf import settings # 引用配置文件
from django.core.files.storage import Storage # 引用文件仓库，重写方法
from django.utils.deconstruct import deconstructible
from fdfs_client.client import Fdfs_client

@deconstructible
class FastDFSStorage(Storage):
    """
    自定义存储类：
    读取上传的文件，保存文件到FastDFS中
    """

    # def __init__(self, base_url=None, client_conf=None):
    #     """
    #     初始化
    #     :param base_url: 用于构造图片完整路径使用，图片服务器的域名
    #     :param client_conf: FastDFS客户端配置文件的路径
    #     """
    #     # 从配置文件中指定fdfs的FastDFSStorage类路径
    #     if base_url is None:
    #         base_url = settings.FDFS_URL
    base_url = settings.FDFS_URL
        # 从配置文件中指定fdfs的client_conf文件
        # if client_conf is None:
        #     client_conf = settings.FDFS_CLIENT_CONF
    client_conf = settings.FDFS_CLIENT_CONF


    def _open(self, name, mode='rb'):
        """
        用不到打开文件，所以省略
        """
        pass


    def _save(self, name, content):
        """
        在FastDFS中保存文件
        :param name: 传入的文件名
        :param content: 文件内容
        :return: 保存到数据库中的FastDFS的文件名
        """
        client = Fdfs_client(self.client_conf)
        ret = client.upload_by_buffer(content.read())
        if ret.get("Status") != "Upload successed.":
        # 3.
        # 在Django配置中设置自定义文件存储类
        # 在settings / dev.py文件中添加设置
        # 4.
        # 添加image域名
        # 在 / etc / hosts中添加访问FastDFS
        # storage服务器的域名
        # 3.6
        # CKEditor富文本编辑器
        # 在运营后台，运营人员需要录入商品并编辑商品的详情信息，而商品的详情信息不是普通的文本，可以
        # 是包含了HTML语法格式的字符串。为了快速简单的让用户能够在页面中编辑带格式的文本，我们引入
        # 富文本编辑器。富文本即具备丰富样式格式的文本。
        # 我们使用功能强大的CKEditor富文本编辑器。
            raise Exception("upload file failed")
        file_name = ret.get("Remote file_id")
        return file_name


    def url(self, name):
        """
        返回文件的完整URL路径
        :param name: 数据库中保存的文件名
        :return: 完整的URL
        """
        return self.base_url + name


    def exists(self, name):
        """
        判断文件是否存在，FastDFS可以自行解决文件的重名问题
        所以此处返回False，告诉Django上传的都是新文件
        :param name: 文件名
        :return: False
        """
        return False
